table of contents
ACCESS(2) | Podręcznik programisty Linuksa | ACCESS(2) |
NAZWA¶
access - sprawdzenie praw użytkownika do pliku
SKŁADNIA¶
#include <unistd.h> int access(const char *pathname, int mode);
OPIS¶
access sprawdza, czy proces może odczytywać, zapisywać i sprawdzać istnienie pliku (lub innego obiektu systemu plików) o nazwie pathname. Jeśli pathname jest dowiązaniem symbolicznym, sprawdzane są prawa do pliku wskazywanego przez to dowiązanie.
mode jest maską składającą się z jednego lub więcej znaczników spośród R_OK, W_OK, X_OK i F_OK.
R_OK, W_OK i X_OK sprawdzają, czy plik istnieje i ma odpowiednio prawa do odczytu, zapisu i uruchamiania. F_OK sprawdza tylko, czy plik istnieje.
Testy zależą od praw do katalogów, występujących na ścieżce do pliku, podanej w parametrze pathname, a także od praw do katalogów i plików wskazywanych przez występujące po drodze dowiązania symboliczne.
Sprawdzenie jest dokonywane z prawdziwymi uid i gid procesu, a nie efektywnymi, jak to się zwykle robi przy wykonywaniu rzeczywistych operacji. Pozwala to programom z ustawionym bitem set-UID na łatwe określenie autoryzacji użytkownika wywołującego.
Sprawdzane są jedynie bity dostępu, nie zawartość pliku czy jego typ. Dlatego, jeśli katalog okazuje się "zapisywalny", znaczy to prawdopodobnie, że można w nim tworzyć pliki, a nie, że do katalogu można pisać jak do pliku. Podobnie, plik DOS-u może zostać określony jako "wykonywalny", lecz funkcja execve(2) mimo to zawiedzie.
Jeśli proces posiada odpowiednie uprawninia, implementacja może spowodować pomyślne zakończenie dla X_OK nawet, gdy nie jest ustawiony żaden z bitów uruchamialności w prawach dostępu do pliku.
WARTOŚĆ ZWRACANA¶
Gdy wszystko pójdzie dobrze (wszystkie żądane prawa są zapewnione), zwracane jest zero. W wypadku błędu (przynajmniej jeden bit z żądanych w mode uprawnień nie jest ustawiony lub wystąpiły inne błędy), zwracane jest -1 i odpowiednio ustawiane jest errno.
BŁĘDY¶
Funkcja access musi zakończyć się niepomyślnie gdy:
- EACCES
- Brak uprawnień dla żądanego dostępu do pliku, albo brak uprawnień do przeglądania dla któregoś z katalogów w pathname.
- ELOOP
- Napotkano zbyt wiele dowiązań symbolicznych podczas rozwiązywania pathname.
- ENAMETOOLONG
- pathname jest zbyt długie.
- ENOENT
- Składnik pathname będący katalogiem byłby dostępny, ale nie istnieje lub jest wiszącym dowiązaniem symbolicznym.
- ENOTDIR
- Składnik pathname, który powinien być katalogiem w rzeczywistości katalogiem nie jest.
- EROFS
- Żądano zapisu do pliku położonego w systemie plików tylko do odczytu.
- EFAULT
- pathname wskazuje poza dostępną dla użytkownika przestrzeń adresową.
- EINVAL
- mode zostało nieprawidłowo podane.
- EIO
- Wystąpił błąd wejścia/wyjścia.
- ENOMEM
- Nie starczyło pamięci kernela. TP ETXTBSY Wystąpiła próba dostępu z prawem zapisu do pliku aktualnie uruchomionego programu.
OGRANICZENIA¶
access zwraca błąd, jeśli jakikolwiek z żądanych w wywołaniu rodzajów dostępu nie zostanie zapewniony, nawet jeśli reszta zostanie.
access może nie działać prawidłowo na systemach plików NFS z włączonym mapowaniem UID, ponieważ mapowanie to jest dokonywane na serwerze i ukryte przed klientem sprawdzającym prawa dostępu.
Użycie funkcji access w celu sprawdzenia, czy użytkownik ma uprawnienia na przykład do otwarcia pliku, przed otwarciem tego pliku za pomocą open(2) tworzy dziurę w bezpieczeństwie, ponieważ użytkownik może wykorzystać krótki okres czas pomiędzy sprawdzeniem pliku a otwarciem go do manipulacji na pliku.
ZGODNE Z¶
SVID, AT&T, POSIX, X/OPEN, BSD 4.3
ZOBACZ TAKŻE¶
2002-04-23 | Linux |